import regexIdCardNum from "./regexIdCardNum";

/**
 * 验证身份证号码
 * @param num {string} 身份证号码
 * @returns {boolean} 返回 true 表示验证通过，返回 false 表示验证不通过
 */
export function validateIdCardNum(num: string): boolean {
  // 如果通过该验证，说明身份证格式正确，但准确性还需计算
  if (!regexIdCardNum.test(num)) {
    return false;
  }

  if (num.length === 15) {
    return true;
  }
  // 加权因子
  const idCardWi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
  // 余数对应的校验码
  const idCardY = [1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2];
  // 前17位加权和
  let idCardWiSum = 0;

  for (let i = 0; i < 17; i++) {
    idCardWiSum += parseInt(num[i], 10) * idCardWi[i];
  }
  // 计算校验码数组索引
  const idCardMod = idCardWiSum % 11;
  // 身份证最后一位
  const idCardLast = num[17].toUpperCase();
  // 用得到的验证码与身份证最后一位进行匹配，如果一致，说明校验通过，否则不通过
  return idCardMod === 2 ? idCardLast === "X" : idCardLast === String(idCardY[idCardMod]);
}
export default validateIdCardNum;
